﻿using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using ABC.Domain.Entities;
using ABC.Domain.Serialization;

namespace ABC.Business.Models
{
    public class FinanceModel
    {
        private readonly RosModel rosModel;

        public FinanceModel(RosModel rosModel)
        {
            this.rosModel = rosModel;
        }

        public Dictionary<string, string> GetInsuranceCompanies()
        {
            return
                rosModel.GetEntities(
                    "[Типы=Партнер;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Asc)];Места=(Партнеры,1)]", new Dictionary<string, object>()).ToDictionary(
                        company => company["id_node"].ToString(),
                        company => company["НазваниеОбъекта"].ToString());
        }

        public Dictionary<string, string> GetTypesOfInsurance()
        {
            return
                rosModel.GetEntities(
                    "[Типы=ЭлементСправочника;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Asc);Места=(ВидыСтрахования,1)]", new Dictionary<string, object>()).ToDictionary(
                        company => company["id_node"].ToString(),
                        company => company["НазваниеОбъекта"].ToString());
        }

        public Dictionary<string, string> GetCredits()
        {
            return
                rosModel.GetEntities(
                    "[Типы=Партнер;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Asc)];Места=(Партнеры,1)]", new Dictionary<string, object> { { "Вид", "Банк" } }).ToDictionary(
                        company => company["id_node"].ToString(),
                        company => company["НазваниеОбъекта"].ToString());
        }
        public Dictionary<string, string> GetProducts(string partnerId, string typeId)
        {
            var filters = new Dictionary<string, object>();
            if (!string.IsNullOrEmpty(typeId))
            {
                filters.Add("Тип", typeId);
            }
            return
                rosModel.GetEntities(
                    "[Типы=Продукт;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Asc);Места=(" + partnerId + ",1)]", filters).ToDictionary(
                        company => company["id_node"].ToString(),
                        company => company["НазваниеОбъекта"].ToString());
        }
        public List<DictionaryItem> GetRewards()
        {
            return
                rosModel.GetEntities(
                    "[Типы=ЭлементСправочника;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Asc);Места=(СеткиФинансовыхПолитик,1)]", new Dictionary<string, object>())
                    .Select(x => new DictionaryItem
                                     {
                                         Id = x["id_node"].ToString(),
                                         Name = x["НазваниеОбъекта"].ToString(),
                                         Value = "False"
                                     }).ToList();
        }

        public List<DictionaryItem> GetSpecialPrograms()
        {
            return
                rosModel.GetEntities(
                    "[Типы=ЭлементСправочника;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Asc);Места=(Спецпрограмма,1)]", new Dictionary<string, object>())
                    .Select(x => new DictionaryItem
                    {
                        Id = x["id_node"].ToString(),
                        Name = x["НазваниеОбъекта"].ToString(),
                        Value = "False"
                    }).ToList();
        }
        public PolicyFinance GetFinancialPolicy(string id)
        {
            var xml = rosModel.GetEntityValue<string>(id, "ФинансоваяПолитикаXml");
            if (!string.IsNullOrEmpty(xml))
            {
                var serializer = new XmlSerializer(typeof(PolicyFinance));
                var stream = new StringReader(xml);
                var result = (PolicyFinance)serializer.Deserialize(stream);
                return result;
            }
            return new PolicyFinance();
        }

        public List<PolicyItem> GetAllFinancialPolicy()
        {
            var partners = rosModel.GetEntities(
                "[Типы=Партнер;Колонки=(НазваниеОбъекта);Сортировки=(НазваниеОбъекта,Asc);Места=(Партнеры,1)]",
                new Dictionary<string, object> { { "ФинансоваяПолитикаXml", "xml" } });
            var result = new List<PolicyItem>();
            foreach (var partner in partners)
            {
                result.AddRange(GetFinancialPolicy(partner["id_node"].ToString()).PolicyItems);
            }
            return result.OrderBy(x => x.CompanyName).ThenBy(x => x.TypeOfInsuranceName).ToList();
        }

        public void SerializeFinancialPolicy(string id, List<PolicyItem> items)
        {
            if (items.Count==0)
            {
                rosModel.UpdateEntityValue(id, "ФинансоваяПолитикаXml", "");
            }
            else
            {
                var serializer = new XmlSerializer(typeof(PolicyFinance));
                var finance = new PolicyFinance();
                finance.PolicyItems = items;
                var sb = new StringBuilder();
                var w = new StringWriter(sb, System.Globalization.CultureInfo.InvariantCulture);
                serializer.Serialize(w, finance);
                rosModel.UpdateEntityValue(id, "ФинансоваяПолитикаXml", sb.ToString());
            }
        }
    }
}
